import {
	IParam,
	IUIActionResult,
	IActionModel,
	IContext,
	IAbility,
	IHttpResponse,
	deepCopy,
	IViewAbility,
	srfpluralize,
	hasFunction,
	formatUrlString,
	IRedirectInput,
	transformDoData,
} from '@/core';
import { Http } from '@/http';
import { EntityUIServiceBase } from '../entity-ui-service-base';
import ManageUILogic from './manage-ui-logic';

/**
 * 组织机构UI服务对象基类
 * 基于template/src/ui-service/{{appEntities}}/{{appEntities}}-ui-service-base.ts.hbs生成
 *
 * @export
 * @class Sys_organizationUIServiceBase
 * @extends {UIService}
 */
export class Sys_organizationUIServiceBase extends EntityUIServiceBase {
	/**
	 * Creates an instance of Sys_organizationUIServiceBase
	 *
	 * @param {*} [opts={}]
	 * @memberof Sys_organizationUIServiceBase
	 */
	constructor(opts: IParam = {}) {
		super(opts);
		this.appDeKeyFieldName = 'id';
		// 是否启用主状态
		this.isEnableDEMainState = false;
		this.allViewMap.set(':', {
			viewName: 'sys_organizationOrgDepartmentTreeExpView',
			viewType: 'DETREEEXPVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationManagementView',
			viewType: 'DEGRIDVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationParentOrgPickupView',
			viewType: 'DEPICKUPVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationParentOrgPickupGridView',
			viewType: 'DEPICKUPGRIDVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationUsr03EditView',
			viewType: 'DEEDITVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationTreeExpView',
			viewType: 'DETREEEXPVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationNewEditView',
			viewType: 'DEEDITVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationOrgDetailsView',
			viewType: 'DEEDITVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set('EDITVIEW:', {
			viewName: 'sys_organizationEditView',
			viewType: 'DEEDITVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set(':', {
			viewName: 'sys_organizationPickupGridView',
			viewType: 'DEPICKUPGRIDVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set('REDIRECTVIEW:', {
			viewName: 'sys_organizationRedirectView',
			viewType: 'DEREDIRECTVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
		this.allViewMap.set('PICKUPVIEW:', {
			viewName: 'sys_organizationPickupView',
			viewType: 'DEPICKUPVIEW',
			srfappde: 'sys_organizations',
			deCodeName: 'Sys_organization',
		});
	}

	/**
	 * 添加子单位
	 *
	 * @param {*} params
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async AddSubOrg(
		uiContext: IContext,
		uiViewParams: IParam,
		uiData: IParam[],
		event: MouseEvent,
		ability: IAbility
	): Promise<IUIActionResult> {
		const actionModel: IActionModel = {
			actionTarget: 'NONE',
			reloadData: true,
			refreshMode: 2,
			entityCodeName: 'Sys_organization',
			keyFieldCodeName: 'Id',
			majorFieldCodeName: 'Organization_name',
			closeEditView: false,
			navContexts: { sys_organization: '' },
		};
		// 根据行为目标 合并行为参数
		const { context, viewParams, data } = await this.handleUIActionParam(
			uiContext,
			uiViewParams,
			uiData,
			actionModel
		);
		// 根据视图名称 获取视图详情
		const view = App.getAppViewConfig()['sys_organizationUsr03EditView'];
		if (!view) {
			App.getNotificationHelper().warning('', '目标视图不存在');
			return { ok: false, data: [] };
		}
		// 打开视图
		const actionResult = await App.getOpenViewHelper().openPage(
			view,
			context,
			viewParams
		);
		if (actionResult && actionResult.ok) {
			return await this.afterAction(
				context,
				viewParams,
				data,
				event,
				ability,
				actionModel
			);
		} else {
			return { ok: false, data: [] };
		}
	}

	/**
	 * 管理
	 *
	 * @param {*} params
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async ManageOrg(
		uiContext: IContext,
		uiViewParams: IParam,
		uiData: IParam[],
		event: MouseEvent,
		ability: IAbility
	): Promise<IUIActionResult> {
		//	替换执行界面逻辑
		return await this.executeUILogic(
			'manage',
			uiContext,
			uiViewParams,
			uiData,
			event,
			ability
		);
	}

	/**
	 * 添加部门
	 *
	 * @param {*} params
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async NewDept(
		uiContext: IContext,
		uiViewParams: IParam,
		uiData: IParam[],
		event: MouseEvent,
		ability: IAbility
	): Promise<IUIActionResult> {
		const actionModel: IActionModel = {
			actionTarget: 'SINGLEKEY',
			reloadData: true,
			refreshMode: 2,
			entityCodeName: 'Sys_organization',
			keyFieldCodeName: 'Id',
			majorFieldCodeName: 'Organization_name',
			closeEditView: false,
		};
		// 根据行为目标 合并行为参数
		const { context, viewParams, data } = await this.handleUIActionParam(
			uiContext,
			uiViewParams,
			uiData,
			actionModel
		);
		// 根据视图名称 获取视图详情
		const view = App.getAppViewConfig()['sys_departmentNewEditView'];
		if (!view) {
			App.getNotificationHelper().warning('', '目标视图不存在');
			return { ok: false, data: [] };
		}
		// 打开视图
		const actionResult = await App.getOpenViewHelper().openPage(
			view,
			context,
			viewParams
		);
		if (actionResult && actionResult.ok) {
			return await this.afterAction(
				context,
				viewParams,
				data,
				event,
				ability,
				actionModel
			);
		} else {
			return { ok: false, data: [] };
		}
	}

	/**
	 * 保存
	 *
	 * @param {*} params
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async SaveAndRefresh(
		uiContext: IContext,
		uiViewParams: IParam,
		uiData: IParam[],
		event: MouseEvent,
		ability: IAbility
	): Promise<IUIActionResult> {
		const actionModel: IActionModel = {
			actionTarget: 'SINGLEDATA',
			reloadData: true,
			refreshMode: 3,
			entityCodeName: 'Sys_organization',
			keyFieldCodeName: 'Id',
			majorFieldCodeName: 'Organization_name',
			closeEditView: false,
		};
		// 根据行为目标 合并行为参数
		const { context, viewParams, data } = await this.handleUIActionParam(
			uiContext,
			uiViewParams,
			uiData,
			actionModel
		);
		try {
			if (
				ability &&
				hasFunction(ability, 'validate') &&
				(actionModel.actionTarget == 'SINGLEDATA' ||
					actionModel.actionTarget == 'MULTIDATA')
			) {
				//	校验(暂时只考虑表格与表单)
				if (!(await (ability as any).validate())) {
					//	提示信息待确认
					return { ok: false, data: [] };
				}
			}
			//  获取实体服务
			const dataService = await App.getDataService('Sys_organization', context);
			if (context.srfsessionid) {
				Object.assign(context, { srfsessionkey: context.srfsessionid });
				delete context.srfsessionid;
			}
			const tempData = data[0];
			const response: IHttpResponse = await dataService['Update'](
				context,
				tempData
			);
			if (!response.success) {
				App.getNotificationHelper().error(
					App.ts('common.generic.error'),
					response.message || ''
				);
				return { ok: false, data: [] };
			}
			App.getNotificationHelper().success('成功', '保存成功！');
			return await this.afterAction(
				context,
				viewParams,
				response.data,
				event,
				ability,
				actionModel
			);
		} catch (error: any) {
			App.getNotificationHelper().error(
				App.ts('common.generic.error'),
				error.message || ''
			);
			return { ok: false, data: error };
		}
	}

	/**
	 * 人员维护
	 *
	 * @param {*} params
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async openOrgPerson(
		uiContext: IContext,
		uiViewParams: IParam,
		uiData: IParam[],
		event: MouseEvent,
		ability: IAbility
	): Promise<IUIActionResult> {
		const actionModel: IActionModel = {
			actionTarget: 'SINGLEDATA',
			reloadData: false,
			refreshMode: 0,
			entityCodeName: 'Sys_organization',
			keyFieldCodeName: 'Id',
			majorFieldCodeName: 'Organization_name',
			closeEditView: false,
			navContexts: { orgid: '%orgid%' },
			navParams: { orgid: '%orgid%' },
		};
		// 根据行为目标 合并行为参数
		const { context, viewParams, data } = await this.handleUIActionParam(
			uiContext,
			uiViewParams,
			uiData,
			actionModel
		);
		// 根据视图名称 获取视图详情
		const view =
			App.getAppViewConfig()['sys_organizationOrgDepartmentTreeExpView'];
		if (!view) {
			App.getNotificationHelper().warning('', '目标视图不存在');
			return { ok: false, data: [] };
		}
		// 打开视图
		const actionResult = await App.getOpenViewHelper().openPage(
			view,
			context,
			viewParams
		);
		if (actionResult && actionResult.ok) {
			return await this.afterAction(
				context,
				viewParams,
				data,
				event,
				ability,
				actionModel
			);
		} else {
			return { ok: false, data: [] };
		}
	}

	/**
	 * 获取指定数据的重定向页面
	 *
	 * @param context 应用上下文
	 * @param viewParams 视图参数
	 * @param data 业务数据
	 * @param redirectParam 重定向视图输入参数
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async getAppRDView(
		context: IContext,
		viewParams: IParam,
		data: IParam,
		redirectParam: IRedirectInput
	) {
		// 进行数据查询
		const service = await App.getDataService('Sys_organization', context);
		const tempContext: IContext = deepCopy(context);
		const key: string = 'sys_organization';
		let srfkey: string | null = null;
		if (data && data.hasOwnProperty(key)) {
			srfkey = data[key];
		} else if (context && context[key]) {
			srfkey = context[key];
		} else if (viewParams && viewParams[key]) {
			srfkey = viewParams[key];
		}
		Object.assign(tempContext, { [key]: srfkey });
		let result: any;
		if (
			redirectParam.redirectAction &&
			service[redirectParam.redirectAction] &&
			service[redirectParam.redirectAction] instanceof Function
		) {
			result = await service[redirectParam.redirectAction](tempContext, data);
		} else {
			result = await service.Get(tempContext, data);
		}
		const curData: any = result.data;
		// 判断当前数据模式,默认为true,todo
		const iRealDEModel: boolean = true;
		let bDataInWF: boolean = false;
		let bWFMode: any = false;
		if (redirectParam.isEnableWorkflow) {
			return this.getWFView();
		} else {
			if (
				viewParams &&
				viewParams.srfwf &&
				this.InWorkflowArray.indexOf(viewParams.srfwf) !== -1
			) {
				return this.getWFView();
			}
		}
		let strPDTViewParam: string = await this.getDESDDEViewPDTParam(
			curData,
			bDataInWF,
			bWFMode
		);
		return this.allViewMap.get(strPDTViewParam);
	}

	/**
	 * 获取实体单数据实体视图预定义参数
	 *
	 * @param curData 当前数据
	 * @param bDataInWF 是否有数据在工作流中
	 * @param bWFMode   是否工作流模式
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async getDESDDEViewPDTParam(
		curData: any,
		bDataInWF: boolean,
		bWFMode: boolean
	) {
		let strPDTParam: string = '';
		if (bDataInWF) {
			// TODO 判断数据是否在流程中
		}
		// TODO 多表单
		const multiFormDEField: string | null = null;

		const isApp = App.getProjectSetting().isApp;
		if (multiFormDEField) {
			const objFormValue: string = curData[multiFormDEField];
			if (isApp) {
				return 'MOBEDITVIEW:' + objFormValue;
			}
			return 'EDITVIEW:' + objFormValue;
		}
		if (isApp) {
			if (this.getDEMainStateTag(curData)) {
				return `MOBEDITVIEW:MSTAG:${this.getDEMainStateTag(curData)}`;
			}
			return 'MOBEDITVIEW:';
		}
		if (this.getDEMainStateTag(curData)) {
			return `EDITVIEW:MSTAG:${this.getDEMainStateTag(curData)}`;
		}
		return 'EDITVIEW:';
	}

	/**
	 * 执行界面逻辑
	 * @param logicTag 界面逻辑标识
	 * @param context 应用上下文
	 * @param viewParams 视图参数
	 * @param data 业务数据
	 * @param event 事件对象
	 * @param ability 当前环境能力
	 * @memberof Sys_organizationUIServiceBase
	 */
	public async executeUILogic<T extends IAbility>(
		logicTag: string,
		context: IContext,
		viewParams: IParam,
		data: IParam[],
		event: MouseEvent,
		ability: T
	): Promise<IUIActionResult> {
		if (logicTag === 'manage') {
			return await ManageUILogic.getInstance().execute(
				context,
				viewParams,
				data[0],
				event,
				ability
			);
		}
		return { ok: true, data: null };
	}
}
